package com.unicom.netpd.rpa;


import com.unicom.netpd.rpa.constant.LogTypeEnum;
import com.unicom.netpd.rpa.constant.RedisDataTypeEnum;
import com.unicom.netpd.rpa.entity.block.BlockOutput;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 各组件需要继承的父类
 * @Author liup351
 */

@Component
public abstract class BlockInstanceBase {

    @Autowired
    protected RedisTemplate redisTemplate;

    /************************************* 以下为各组件需要实现的相关操作 ********************************************************/

    //流程实例Id
    private String FLOWINSTANCEID;
    //组件实例Id
    private String BLOCKINSTANCEID;

//111

    /**
     * 组件准备方法(由控制中心触发)
     * 需要进行参数校验等准备工作
     * @param flowInstanceId 流程实例Id
     * @param blockInstanceId 组件实例Id
     * @return 组件实例是否准备完成（阻塞）
     */
    public Boolean prepare(String flowInstanceId,String blockInstanceId){
        FLOWINSTANCEID = flowInstanceId;
        BLOCKINSTANCEID = blockInstanceId;
        // TODO 需要进行参数校验等准备工作
        return true;
    }

    /**
     * 组件执行方法(由控制中心触发)
     * 需要编写组件核心方法
     * @return BlockOutput 返回结构体
     */
    public BlockOutput execute(){
        //TODO 需要编写组件核心方法
        return new BlockOutput();
    }


    /**
     * 组件执行后验证方法(由控制中心请求)
     * 包括清理outputVar等操作
     * @return
     */
    public Boolean after(){
        //TODO 包括清理outputVar等操作，清除该实例等操作
        return true;
    }




    /*************************************  以下为获取input相关信息的操作  *******************************************************/


    /**
     * 获取全局变量
     * @return
     */
    protected Map getGlobalVar(){
        return (Map) redisTemplate.opsForHash().get(FLOWINSTANCEID,RedisDataTypeEnum.GLOBALVARMAP.getValue());

    }

    /**
     * 获取局部配置变量
     * 特定的key：请参考BlockConfigEnum枚举类
     * @return
     */
    protected Map getLocalConfig(String key){

        return (Map) redisTemplate.opsForHash().get(BLOCKINSTANCEID,RedisDataTypeEnum.LOCALCONFIGMAP.getValue());
    }


    /*************************************  以下为日志相关操作  *******************************************************/


    /**
     * 写入日志
     * @param logType 日志类型
     * @param logMsg 日志信息
     */
    protected Boolean writeLog(String logType, String logMsg){
        if(!LogTypeEnum.containLogType(logType)){
            return false;
        }
        //TODO liup351需实现mongodb写入日志方法
        return true;
    }


    /*************************************  以下为文件相关操作  *******************************************************/


    /**
     * 上传文件
     * @param file 需要上传的文件
     * @return fileId 文件唯一id
     */
    protected String uploadFile(Object file){
        String fileId = "";
        //TODO liup351需实现oss对象存储的上传方法
        return fileId;
    }

    /**
     * 获取文件
     * @param fileId 文件唯一id
     * @return file 获取的文件
     */
    protected Object getFile(String fileId){
        Object file = new Object();
        //TODO liup351需实现oss对象存储的下载方法
        return file;
    }
}
